/**
 * @file NDS03_ContiunousRangingInterrupt_Example.c
 * @author tongsheng.tang
 * @brief 连续测量中断示例
 * @version 2.x.x
 * @date 2024-04
 * 
 * @copyright Copyright (c) 2024, Nephotonics Information Technology (Hefei) Co., Ltd.
 * 
 */

#include <stdio.h>
#include "nds03_platform.h"
#include "nds03_comm.h"
#include "nds03_dev.h"
#include "nds03_data.h"
#include "nds03_calib.h"
#include "nds03_def.h"

/** 模组设备 */
NDS03_Dev_t g_nds03_device = {
                .platform.i2c_dev_addr = NDS03_DEFAULT_SLAVE_ADDR, 
                .platform.xshut_pin = 0,
            };
/* 循环测距次数为100次 */
int32_t cnt = 100;

/**
 * @brief 单次测量接口
 * 
 * @param pNxDevice 模组设备
 */
void SG_RangingTest(NDS03_Dev_t *pNxDevice)
{
    /* 获取测量数据 */
    NDS03_GetInterruptRangingData(pNxDevice);
    NX_PRINTF("depth:%d mm, confi:%d, count:%d\r\n", pNxDevice->ranging_data[0].depth, pNxDevice->ranging_data[0].confi, pNxDevice->ranging_data[0].count);
}

/**
 * @brief 用户实现NDS03 GPIO1引脚的配置
 *        配置NDS03 GPIO1引脚为中断输入且是下降沿触发
 * 
 */
void USER_GPIO1PinConfig(void){
    // 用户实现代码

}

/**
 * @brief NDS03连续中断测量主函数示例
 * 
 * @return int32_t 
 */
int32_t main(void)
{
    NDS03_Dev_t     *pNxDevice = &g_nds03_device;

    /* 初始化平台，包含I2C初始化 */
    if(NDS03_ERROR_NONE != nds03_platform_init(&pNxDevice->platform, NULL))
    {
        printf("nds03_platform init error\n");
        return NDS03_ERROR_CALIB;
    }

    /* 初始化设备变量的IIC地址 */
    pNxDevice->platform.i2c_dev_addr = NDS03_DEFAULT_SLAVE_ADDR;

    /* 循环等待设备启动, 若模组或者IIC读写函数有问题则会报错 */
    if(NDS03_ERROR_NONE != NDS03_WaitDeviceBootUp(pNxDevice))
    {
        NX_PRINTF("NDS03_WaitDeviceBootUp error\r\n");
        return NDS03_ERROR_BOOT;
    }   

    /* 初始化模组设备 */
    if(NDS03_ERROR_NONE != NDS03_InitDevice(pNxDevice))
    {
        NX_PRINTF("NDS03_InitDevice error!!\r\n");
        return NDS03_ERROR_INIT;
    }

    /* 用户配置中断引脚代码 */
    USER_GPIO1PinConfig();

    /* 设置使用有新数据时触发中断,且低电平产生中断 */
    NDS03_SetGpio1Config(pNxDevice, NDS03_GPIO1_NEW_MEASURE_READY, NDS03_GPIO1_POLARITY_LOW);
    /* 连续模式开启测量 */
    NDS03_StartContinuousMeasurement(pNxDevice);
    /* 循环测量 */
    while(cnt) {
        NDS03_Delay1ms(pNxDevice, 10);
    }
    /* 连续模式关闭测量 */
    NDS03_StopContinuousMeasurement(pNxDevice);
    /* 关闭测距中断 */
    NDS03_SetGpio1Config(pNxDevice, NDS03_GPIO1_FUNCTIONALITY_OFF, NDS03_GPIO1_POLARITY_LOW);

    /* 释放平台 */
    nds03_platform_uninit(pNxDevice, NULL);

    return 0;
}

/* 中断服务函数，在中断中调用 */
void Interrupt_Handle(void){
    SG_RangingTest(&g_nds03_device);
    cnt--;
}

